﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Server
{
    public class AuktionsService
    {
        // Liste til at holde styr på klienterne der er tilsluttet
        List<ClientHandler> auktionsKlienter = new List<ClientHandler>();

        VareQueue varequeue = new VareQueue(); // Kø med varer før de bliver sat til auktion
        Vare vare; // nuværende vare der er på auktion

        Hammerslag hammerslag;
        Thread tråd;

        public AuktionsService()
        {
            vare = varequeue.HentVare();
            if (vare != null) // hvis der er varer i listen
            {
                hammerslag = new Hammerslag(10, 5, 3, this); // instantierer hammerslag op med de givne tider
                StartHammerslag(); // starter hammerslaget med en metode
            }
            else
            {
                MulticastBesked("Ingen auktioner i dag");
            }
        }

        public void StartHammerslag()
        {
            // opretter en ny tråd og starter den op
            tråd = new Thread(hammerslag.RunHammerslag);
            tråd.Name = "hammerslag";
            tråd.Start();
        }
        public void TilmeldKlient(ClientHandler klient)
        {
            // tilføjer nye klienter til listen
            auktionsKlienter.Add(klient);
        }

        public void AfmeldKlient(ClientHandler klient)
        {
            // fjerner klienter fra listen
            auktionsKlienter.Remove(klient);
        }

        public void MulticastBesked(string besked)
        {
            // sender besked til alle klienter i listen
            foreach (var klient in auktionsKlienter)
            {
                klient.WriteData(besked);
            }
        }

        public bool nytBud(int bud, string klient)
        {
            if (vare != null)
            {
                bool budfest = vare.NytBud(bud, klient);
                if (budfest) // hvis buddet er rigtigt
                {
                    hammerslag.Bud(); // hammerslaget genstarter
                }
                return budfest;
            }
            return false;
        }
        public string HentVarebetegnelse()
        {
            if (vare != null)
                return "Nuværende vare er " + vare.Varebetegnelse + ". Højeste bud er " + vare.HøjesteBud + ". Mindsteprisen er " + vare.Mindstepris;
            else
                return "Der er ingen varer";
        }

        public void Hammerslag()
        {
            // når der er hammerslag, skrives ud hvem der har vundet auktionen.
            // derefter kommer næste vare i auktionen hvis der er nogen. hvis ikke, bliver klienterne logget af
            MulticastBesked("Tredje. " + vare.Varebetegnelse + " solgt til " + vare.HøjestBydende + " for " + vare.HøjesteBud + " kr.");
            Console.WriteLine(vare.Varebetegnelse + " solgt til " + vare.HøjestBydende + " for " + vare.HøjesteBud + " kr.");
            vare = varequeue.HentVare();
            if (vare != null)
            {
                MulticastBesked(HentVarebetegnelse());
                Console.WriteLine(vare.Varebetegnelse + " sat til salg");
                StartHammerslag();
            }
            else
            {
                MulticastBesked("Ikke flere auktioner i dag");
                MulticastBesked("Forbindelsen lukkes");
                foreach (var klient in auktionsKlienter)
                {
                    klient.KlientStop();
                }
            }
        }
    }
}
